import logging  # 导入logging模块

# 1. 创建日志器（Logger）
logger = logging.getLogger("MyTestLogger")  # 创建名为"MyTestLogger"的日志器
logger.setLevel(logging.DEBUG)  # 设置日志器的最低处理级别为DEBUG

# 2. 创建处理器（Handler）：输出到控制台和文件
# 控制台处理器（StreamHandler）
console_handler = logging.StreamHandler()  # 输出到控制台
console_handler.setLevel(logging.INFO)      # 控制台仅处理INFO及以上级别的日志

# 文件处理器（FileHandler）
file_handler = logging.FileHandler("test.log", encoding="utf-8")  # 输出到文件，指定编码避免中文乱码
file_handler.setLevel(logging.DEBUG)     # 文件处理DEBUG及以上级别的日志

# 3. 创建格式器（Formatter）
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s',
    datefmt="%Y-%m-%d %H:%M:%S"  # 自定义时间格式
)

# 4. 将格式器绑定到处理器
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 5. 将处理器添加到日志器
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 6. （可选）添加过滤器（Filter）：示例：仅允许包含"test"关键词的日志通过
class CustomFilter(logging.Filter):
    def filter(self, record):
        return "test" in record.getMessage()  # 仅保留消息中包含"test"的日志

filter = CustomFilter()
logger.addFilter(filter)  # 将过滤器添加到日志器

# 输出日志验证
logger.debug("debug日志：包含test关键词会被输出" if "test" in "debug日志" else "debug日志：不包含test会被过滤")
logger.info("info日志：这是一条包含test的信息")  # 包含"test"，会被输出到控制台和文件
logger.error("error日志：不包含test关键词会被过滤")  # 不包含"test"，会被过滤器拦截

# 输出结果：
# 控制台显示INFO级别且包含"test"的日志；
# 文件test.log中显示DEBUG和INFO级别且包含"test"的日志，格式包含时间、日志器名、级别、模块/行号和内容